package com.commerce.product.service;

import com.commerce.common.entity.FlashSaleProduct;

import java.util.List;

/**
 * 秒杀库存服务接口
 */
public interface FlashSaleStockService {

    /**
     * 预热秒杀商品库存到Redis
     * @param flashSaleId 秒杀活动ID
     */
    void preloadFlashSaleStock(Long flashSaleId);

    /**
     * 预热单个秒杀商品库存
     * @param flashSaleProduct 秒杀商品
     */
    void preloadSingleProductStock(FlashSaleProduct flashSaleProduct);

    /**
     * 预减库存
     * @param flashSaleId 秒杀活动ID
     * @param productId 商品ID
     * @param quantity 数量
     * @return 预减结果：true-成功，false-失败
     */
    boolean deductStock(Long flashSaleId, Long productId, Integer quantity);

    /**
     * 回滚库存
     * @param flashSaleId 秒杀活动ID
     * @param productId 商品ID
     * @param quantity 数量
     */
    void rollbackStock(Long flashSaleId, Long productId, Integer quantity);

    /**
     * 获取Redis中的库存
     * @param flashSaleId 秒杀活动ID
     * @param productId 商品ID
     * @return 库存数量
     */
    Integer getRedisStock(Long flashSaleId, Long productId);

    /**
     * 同步Redis库存到数据库
     * @param flashSaleId 秒杀活动ID
     */
    void syncStockToDatabase(Long flashSaleId);

    /**
     * 清除Redis中的库存缓存
     * @param flashSaleId 秒杀活动ID
     */
    void clearStockCache(Long flashSaleId);

    /**
     * 检查库存是否充足
     * @param flashSaleId 秒杀活动ID
     * @param productId 商品ID
     * @param quantity 需要的数量
     * @return 是否充足
     */
    boolean checkStock(Long flashSaleId, Long productId, Integer quantity);

    /**
     * 获取所有需要预热的秒杀活动
     * @return 秒杀活动ID列表
     */
    List<Long> getActiveFlashSaleIds();

    /**
     * 预热所有活跃的秒杀活动库存
     */
    void preloadAllActiveFlashSaleStock();
}
